// 2021华为机试.叠积木 https://www.nowcoder.com/discuss/663327
//积木宽高相等，长度不等，每层只能放一个或拼接多个积木，每层长度相等，求最大层数，最少2层。
//输入：给定积木的长度，以空格分隔，例如:3 6 6 3。
//输出：如果可以搭建，返回最大层数，如果不可以返回-1。
//输入：3 6 6 3
//输出：3
//输入：3 5
//输出：-1
//分析：设所有积木长度总和为 sum ，若可以搭建为 m 层，每层积木长度为 n ，则必有
// sum = mn 设积木中长度最大值为 L1 ，则必有 n >= L1 本题只需求出积木总长度 sum
//， 找出其所有大于 L1 小于 sum 的因数，分别判断以此为每层长度能否成功搭建，
//如果可以，记录层数，最终找到最大的层数.在找每一层所要用的积木时，使用贪心策略，从大的积木开始判断
// 积木最长 L1, L2....
// 共m层 x n宽 = sum
// m ------------
// . ------- ----
// 1 ---- -------
// 0 --------- --

#include <bits/stdc++.h>
using namespace std;

#define DEBUG_
#ifdef DEBUG_
#define PF(...) printf(__VA_ARGS__)
#define FRE(x)                    \
  freopen("d:/oj/" #x ".in", "r", \
          stdin)  //,freopen("d:/oj/"#x".out","w",stdout)
#define FREC fclose(stdin), fclose(stdout);
#else
#define PF(...)
#define FRE(x)
#define FREC
#endif

class Solution1 {
 public:
  vector<int> visited;
  //用于标记nums中对应下标的元素有没有被选取
  // iStart:开始位置， cw:当前和, k : 还需要找的子集个数
  // width: 每层宽
  bool backTrace(const vector<int>& nums, const size_t& targetWidth,
                 int nLevlCnt, int iStart, int curWidth) {
    if (nLevlCnt == 0) {
      return true;
    }
    if (curWidth == targetWidth) {
      //又回到数组的起点重新寻找下一个集合
      return backTrace(nums, targetWidth, nLevlCnt - 1, 0, 0);
    }
    for (int i = iStart; i < nums.size(); ++i) {
      if (visited[i] == 0 && curWidth + nums[i] <= targetWidth) {
        visited[i] = 1;
        if (backTrace(nums, targetWidth, nLevlCnt, i + 1, curWidth + nums[i])) {
          return true;
        }
        visited[i] = 0;
      }
    }
    return false;
  }

  bool canPartitionKSubsets(vector<int>& nums, int nLevlCnt) {
    int sum = std::accumulate(nums.begin(), nums.end(), 0);
    if (sum % nLevlCnt > 0) return false;
    visited = vector<int>(nums.size(), 0);
    return backTrace(nums, sum / nLevlCnt, nLevlCnt, 0, 0);
  }
};

int main() {
  //搭积木
  vector<int> vtAllBrick = {};
  string nn =
      "3522 181 521 515 304 123 2512 312 922 407 146 1932 4037 2646 3871 269";
  //    getline(cin, nn);
  stringstream iss(nn);
  while (getline(iss, nn, ' ')) {
    vtAllBrick.push_back(atoi(nn.c_str()));
  }
  long lenTotal = std::accumulate(vtAllBrick.begin(), vtAllBrick.end(), 0);
  int ret = -1;
  Solution1 a;
  for (size_t levlCnt = vtAllBrick.size(); levlCnt >= 2; levlCnt--) {
    if (lenTotal % levlCnt > 0) {
      continue;
    }
    int perNum = lenTotal / levlCnt;
    //判断能否分成i个相同的子集
    if (a.canPartitionKSubsets(vtAllBrick, levlCnt)) {
      cout << levlCnt << endl;
      return levlCnt;
    }
  }
  cout << ret << endl;
  return 1;
}
